home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / system-config-printer / my-default-printer.py < prev    next >
Text File  |  2009-10-19  |  9KB  |  266 lines

  1. #!/usr/bin/env python
  2.  
  3. ## my-default-printer
  4.  
  5. ## Copyright (C) 2006, 2007, 2008 Red Hat, Inc.
  6. ## Copyright (C) 2007, 2008 Tim Waugh <twaugh@redhat.com>
  7.  
  8. ## This program is free software; you can redistribute it and/or modify
  9. ## it under the terms of the GNU General Public License as published by
  10. ## the Free Software Foundation; either version 2 of the License, or
  11. ## (at your option) any later version.
  12.  
  13. ## This program is distributed in the hope that it will be useful,
  14. ## but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. ## GNU General Public License for more details.
  17.  
  18. ## You should have received a copy of the GNU General Public License
  19. ## along with this program; if not, write to the Free Software
  20. ## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  
  22. import cups
  23. import gobject
  24. import gtk
  25. import os
  26. import signal
  27. import sys
  28.  
  29. domain='system-config-printer'
  30. import locale
  31. try:
  32.     locale.setlocale (locale.LC_ALL, "")
  33. except locale.Error, e:
  34.     os.environ['LC_ALL'] = 'C'
  35.     locale.setlocale (locale.LC_ALL, "")
  36.  
  37. from gettext import gettext as _
  38. import gettext
  39. gettext.textdomain (domain)
  40.  
  41. def handle_sigchld (signum, stack):
  42.     try:
  43.         (pid, status) = os.wait ()
  44.         exitcode = os.WEXITSTATUS (status)
  45.         if exitcode != 0:
  46.             print "Child exit status %d" % exitcode
  47.     except OSError:
  48.         pass
  49.  
  50. signal.signal (signal.SIGCHLD, handle_sigchld)
  51.  
  52. class Server:
  53.     def __init__ (self):
  54.         self.cups_connection = cups.Connection()
  55.         try:
  56.             lpoptions = os.environ["HOME"]
  57.         except KeyError:
  58.             try:
  59.                 lpoptions = "/home/" + os.environ["USER"]
  60.             except KeyError:
  61.                 lpoptions = None
  62.  
  63.         if lpoptions:
  64.             lpoptions += "/.cups/lpoptions"
  65.  
  66.         self.lpoptions = lpoptions
  67.  
  68.     def clearUserDefault (self):
  69.         if not self.lpoptions:
  70.             return
  71.  
  72.         try:
  73.             opts = file (self.lpoptions).readlines ()
  74.         except IOError:
  75.             return
  76.  
  77.         for i in range (len (opts)):
  78.             if opts[i].startswith ("Default "):
  79.                 opts[i] = "Dest " + opts[i][8:]
  80.         file (self.lpoptions, "w").writelines (opts)
  81.  
  82.     def setUserDefault (self, default):
  83.         pid = os.fork ()
  84.         if pid == 0:
  85.             # Child
  86.             null = file ("/dev/null", "r+")
  87.             f = null.fileno ()
  88.             if f != 0:
  89.                 os.dup2 (f, 0)
  90.             if f != 1:
  91.                 os.dup2 (f, 1)
  92.  
  93.             os.execvp ("lpoptions", [ "lpoptions", "-d", default ])
  94.             sys.exit (1)
  95.  
  96.         # Parent
  97.         return
  98.  
  99.     def isUserDefaultSet (self):
  100.         if self.getUserDefault () != self.getSystemDefault ():
  101.             return True
  102.  
  103.         if self.lpoptions:
  104.             try:
  105.                 opts = file (self.lpoptions).readlines ()
  106.             except IOError:
  107.                 return False
  108.  
  109.             for opt in opts:
  110.                 if opt.startswith ("Default "):
  111.                     return True
  112.  
  113.         return False
  114.  
  115.     def getUserDefault (self):
  116.         dests = self.cups_connection.getDests ()
  117.         if dests.has_key ((None, None)):
  118.             return dests[(None, None)].name
  119.  
  120.         for ((name, instance), dest) in dests.iteritems ():
  121.             if dest.is_default:
  122.                 return name
  123.  
  124.         return None
  125.  
  126.     def getSystemDefault (self):
  127.         try:
  128.             return self.cups_connection.getDefault ()
  129.         except:
  130.             pass
  131.  
  132.         return None
  133.  
  134. class Dialog:
  135.     def __init__ (self):
  136.         gtk.window_set_default_icon_name ('printer')
  137.         self.dialog = gtk.Dialog (_("Default Printer"),
  138.                                   None,
  139.                                   gtk.DIALOG_MODAL | gtk.DIALOG_NO_SEPARATOR,
  140.                                   (gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE,
  141.                                    _("_Use System Default"), gtk.RESPONSE_NO,
  142.                                    _("_Set Default"), gtk.RESPONSE_OK))
  143.         self.dialog.set_default_response (gtk.RESPONSE_OK)
  144.         self.dialog.set_border_width (6)
  145.         self.dialog.vbox.set_spacing (2)
  146.         vbox = gtk.VBox (False, 6)
  147.         self.dialog.vbox.pack_start (vbox, True, True, 0)
  148.         vbox.set_border_width (6)
  149.  
  150.         self.model = gtk.ListStore (gobject.TYPE_STRING, gobject.TYPE_STRING)
  151.         self.model.set_sort_column_id (0, gtk.SORT_ASCENDING)
  152.         view = gtk.TreeView (self.model)
  153.         col = gtk.TreeViewColumn (_("Printer"), gtk.CellRendererText (),
  154.                                   text=0)
  155.         col.set_sort_column_id (0)
  156.         view.append_column (col)
  157.  
  158.         col = gtk.TreeViewColumn (_("Location"), gtk.CellRendererText (),
  159.                                   text=1)
  160.         col.set_sort_column_id (1)
  161.         view.append_column (col)
  162.         self.view = view
  163.  
  164.         view.get_selection ().connect ('changed', self.selection_changed)
  165.  
  166.         scrollwin = gtk.ScrolledWindow ()
  167.         scrollwin.set_shadow_type (gtk.SHADOW_IN)
  168.         scrollwin.set_policy (gtk.POLICY_AUTOMATIC,
  169.                               gtk.POLICY_AUTOMATIC)
  170.         scrollwin.add (view)
  171.         vbox.pack_start (scrollwin, True, True, 0)
  172.  
  173.         self.dialog.set_default_size (320, 240)
  174.  
  175.         self.server = Server ()
  176.         for button in self.dialog.action_area.get_children ():
  177.             if button.get_label () == _("_Use System Default"):
  178.                 self.system_default_button = button
  179.             elif button.get_label () == _("_Set Default"):
  180.                 self.set_default_button = button
  181.  
  182.     def selection_changed (self, selection):
  183.         (model, iter) = selection.get_selected ()
  184.         if iter:
  185.             self.last_iter_selected = iter
  186.         else:
  187.             selection.select_iter (self.last_iter_selected)
  188.  
  189.     def run (self):
  190.         c = cups.Connection ()
  191.         printers = c.getPrinters ()
  192.         del c
  193.         user_default = self.server.getUserDefault ()
  194.         for (name, info) in printers.iteritems ():
  195.             iter = self.model.append ()
  196.             self.model.set_value (iter, 0, name)
  197.             self.model.set_value (iter, 1, info['printer-location'])
  198.             if name == user_default:
  199.                 self.view.get_selection ().select_iter (iter)
  200.  
  201.         self.system_default_button.set_sensitive (self.server.
  202.                                                   isUserDefaultSet ())
  203.         self.set_default_button.set_sensitive (len (printers) > 0)
  204.  
  205.         self.dialog.show_all ()
  206.         self.dialog.connect ("response", self.response)
  207.         gtk.main ()
  208.  
  209.     def response (self, dialog, response):
  210.         if (response == gtk.RESPONSE_CLOSE or
  211.             response == gtk.RESPONSE_DELETE_EVENT):
  212.             gtk.main_quit ()
  213.  
  214.         try:
  215.             if response == gtk.RESPONSE_OK:
  216.                 (model, iter) = self.view.get_selection ().get_selected ()
  217.                 name = model.get_value (iter, 0)
  218.                 self.server.setUserDefault (name)
  219.                 self.system_default_button.set_sensitive (True)
  220.             elif response == gtk.RESPONSE_NO:
  221.                 self.server.clearUserDefault ()
  222.                 system_default = self.server.getSystemDefault ()
  223.                 iter = self.model.get_iter_first ()
  224.                 while iter:
  225.                     name = self.model.get_value (iter, 0)
  226.                     if name == system_default:
  227.                         self.view.get_selection ().select_iter (iter)
  228.                         break
  229.                     iter = self.model.iter_next (iter)
  230.                 self.system_default_button.set_sensitive (False)
  231.         except cups.IPPError, (e, s):
  232.             if e == cups.IPP_SERVICE_UNAVAILABLE:
  233.                 error_out ('<span weight="bold" size="larger">' +
  234.                            'CUPS server error' + '</span>\n\n' +
  235.                            'The CUPS scheduler is not running.')
  236.             else:
  237.                 error_out ('<span weight="bold" size="larger">' +
  238.                            'CUPS server error' + '</span>\n\n' +
  239.                            'There was an error during the CUPS operation: ' +
  240.                            s)
  241.  
  242. def error_out (msg):
  243.     d = gtk.MessageDialog (None, 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, '')
  244.     d.set_markup (msg)
  245.     d.run ()
  246.     d.destroy ()
  247.     sys.exit (1)
  248.  
  249. try:
  250.     d = Dialog()
  251.     d.run ()
  252. except RuntimeError:
  253.     error_out ('<span weight="bold" size="larger">' +
  254.                'CUPS server error' + '</span>\n\n' +
  255.                'The CUPS scheduler is not running.')
  256. except cups.IPPError, (e, s):
  257.     if e == cups.IPP_SERVICE_UNAVAILABLE:
  258.         error_out ('<span weight="bold" size="larger">' +
  259.                    'CUPS server error' + '</span>\n\n' +
  260.                    'The CUPS scheduler is not running.')
  261.     else:
  262.         error_out ('<span weight="bold" size="larger">' +
  263.                    'CUPS server error' + '</span>\n\n' +
  264.                    'There was an error during the CUPS operation: ' +
  265.                    s)
  266.